Trước tiên, chúng ta hãy cùng cafedev giới thiệu mọi thứ về Mediator design pattern và phần code ví dụ chi tiết nhằm giúp ace dễ hiểu khi áp dụng trên các ngôn ngữ khác nhau. Ace có thể tham khảo thêm các bài khác tại series Design Pattern tại đây.
Mediator design pattern là một trong những behavioral design pattern quan trọng và được sử dụng rộng rãi. Mediator cho phép tách các đối tượng bằng cách đưa một lớp vào giữa để sự tương tác giữa các đối tượng xảy ra thông qua lớp. Nếu các đối tượng tương tác trực tiếp với nhau, các thành phần hệ thống được kết hợp chặt chẽ với nhau làm cho chi phí bảo trì cao hơn và không khó để mở rộng. Mô hình hòa giải(Mediator) tập trung vào việc cung cấp một người hòa giải giữa các đối tượng để giao tiếp và trợ giúp trong việc thực hiện khớp nối mất kết nối giữa các đối tượng.
Kiểm soát viên không lưu là một ví dụ tuyệt vời về mô hình trung gian trong đó phòng kiểm soát sân bay hoạt động như một trung gian để liên lạc giữa các chuyến bay khác nhau. Mediator hoạt động như một bộ định tuyến giữa các đối tượng và nó có thể có logic riêng để cung cấp cách giao tiếp.
Nội dung chính
1. Mẫu thiết kế Trình hòa giải Sơ đồ UML
Thành phần thiết kế
- Mediator: Nó xác định giao diện giao tiếp giữa các đối tượng đồng nghiệp.
- ConcreteMediator: Nó thực hiện giao diện hòa giải và điều phối giao tiếp giữa các đối tượng đồng nghiệp.
- Đồng nghiệp: Nó xác định giao diện giao tiếp với các đồng nghiệp khác
- ConcreteColleague: Nó triển khai giao diện đồng nghiệp và giao tiếp với các đồng nghiệp khác thông qua trung gian của nó
Hãy xem một ví dụ về mẫu thiết kế Mediator.
class ATCMediator implements IATCMediator
{
private Flight flight;
private Runway runway;
public boolean land;
public void registerRunway(Runway runway)
{
this.runway = runway;
}
public void registerFlight(Flight flight)
{
this.flight = flight;
}
public boolean isLandingOk()
{
return land;
}
@Override
public void setLandingStatus(boolean status)
{
land = status;
}
}
interface Command
{
void land();
}
interface IATCMediator
{
public void registerRunway(Runway runway);
public void registerFlight(Flight flight);
public boolean isLandingOk();
public void setLandingStatus(boolean status);
}
class Flight implements Command
{
private IATCMediator atcMediator;
public Flight(IATCMediator atcMediator)
{
this.atcMediator = atcMediator;
}
public void land()
{
if (atcMediator.isLandingOk())
{
System.out.println("Successfully Landed.");
atcMediator.setLandingStatus(true);
}
else
System.out.println("Waiting for landing.");
}
public void getReady()
{
System.out.println("Ready for landing.");
}
}
class Runway implements Command
{
private IATCMediator atcMediator;
public Runway(IATCMediator atcMediator)
{
this.atcMediator = atcMediator;
atcMediator.setLandingStatus(true);
}
@Override
public void land()
{
System.out.println("Landing permission granted.");
atcMediator.setLandingStatus(true);
}
}
class MediatorDesignPattern
{
public static void main(String args[])
{
IATCMediator atcMediator = new ATCMediator();
Flight sparrow101 = new Flight(atcMediator);
Runway mainRunway = new Runway(atcMediator);
atcMediator.registerFlight(sparrow101);
atcMediator.registerRunway(mainRunway);
sparrow101.getReady();
mainRunway.land();
sparrow101.land();
}
}
Đầu ra:
Ready for landing.
Landing permission granted.
Successfully Landed.
2. Lợi thế
- Nó giới hạn phân lớp. Người hòa giải(Mediator) bản địa hóa hành vi mà nếu không sẽ được phân phối giữa một số đối tượng. Thay đổi hành vi này chỉ yêu cầu Mediator phân lớp con, các lớp Colleague có thể được sử dụng lại nguyên trạng.
3. Bất lợi
- Nó tập trung quyền kiểm soát. Mô hình người hòa giải chuyển đổi mức độ phức tạp của tương tác thành mức độ phức tạp trong người hòa giải. Bởi vì một trung gian đóng gói các giao thức, nó có thể trở nên phức tạp hơn bất kỳ đồng nghiệp cá nhân nào. Điều này có thể khiến bản thân người hòa giải trở thành một khối nguyên khối khó duy trì
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Tài liệu từ cafedev:
- Full series tự học Design Pattern từ cơ bản tới nâng cao tại đây nha.
- Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!